package com.tanhua.admin.controller;

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
import com.tanhua.admin.service.AdminService;
import com.tanhua.model.vo.AdminVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.GET;
import javax.ws.rs.QueryParam;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/system/users")
public class SystemController {

    @Autowired
    private AdminService adminService;

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    /**
     * 获取用户登录验证码
     * GET      /verification
     * 请求参数：Query： uuid
     * 响应数据（不能使用ResponseEntity：返回json数据+状态码）：void
     * 图片：输入流
     * 1、返回void
     * 2.将图片写入到response的输出流中
     */
    @GetMapping("/verification")
    public void verification(String uuid, HttpServletResponse response) throws IOException {
        //1.使用hutool工具类生成验证码图片对象（图片+验证码）
        LineCaptcha captcha = CaptchaUtil.createLineCaptcha(299, 97);//宽，高

        // 2.获取验证码
        String code = captcha.getCode();//验证码
        //3.将验证码存入Redis
        redisTemplate.opsForValue().set("CODE_" + uuid, code, 5, TimeUnit.MINUTES);
        //4.将图片对象的数据写入到response的输出流
        captcha.write(response.getOutputStream());
    }

    /**
     * 用户登录： 管理员登录获取token
     * POST      /login
     * 请求参数：username 账号  password  密码
     * verificationCode  验证码
     * uuid	string  同获取验证码时uuid
     * 返回值：token
     */
    @PostMapping("/login")
    public ResponseEntity login(@RequestBody Map map) {
        //1.获取请求参数
        String username = map.get("username").toString();
        String password = map.get("password").toString();
        String code = map.get("verificationCode").toString();
        String uuid = map.get("uuid").toString();
        //2.调用service登录返回token
        String token = adminService.login(username, password, code, uuid);
        //3.构造返回
        Map retMap = new HashMap();
        retMap.put("token", token);
        return ResponseEntity.ok(retMap);
    }

    /**
     * 根据token获取管理员信息
     * POST       /profile
     * 没有请求数据
     * 响应数据：AdminVo
     * 请求头：  token
     */
    @PostMapping("/profile")
    public ResponseEntity profile() {
        AdminVo vo = adminService.profile();
        return ResponseEntity.ok(vo);
    }

}
